package DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.JOptionPane;

import connection.ConnectionManager;
import modelo.Estadio;
import modelo.Evento;
import modelo.Ingresso;
import modelo.Time;
import modelo.Venda;
import modelo.VendaIngresso;

public class VendaIngressoDAOImp implements VendaIngressoDAO {

	private final String INSERT = "INSERT INTO VendaIngresso(id_ingresso, id_venda) VALUES (?,?)";
	private final String UPDATE = "UPDATE VendaIngresso SET id_ingresso = ?, id_venda = ? WHERE id_vend_ingr = ?";
	private final String DELETE = "DELETE from VendaIngresso WHERE id_vend_ingr = ?";
	private final String ALL = "SELECT id_vend_ingr, id_venda, id_ingresso FROM VendaIngresso";
	private final String IDVENDAINGRESSO = "SELECT id_venda, id_ingresso,id_vend_ingr FROM VendaIngresso WHERE id_vend_ingr = ?";
	private final String IDVENDA = "SELECT id_vend_ingr, id_venda, id_ingresso FROM VendaIngresso WHERE id_venda = ?";
	private final String IDINGRESSO = "SELECT id_venda, id_ingresso,id_vend_ingr FROM VendaIngresso WHERE id_ingresso = ?";

	private ConnectionManager connectionManager;
	private static Connection connection;

	VendaIngressoDAOImp() {
		this.openConnection();
	}

	@Override
	public VendaIngresso salvar(VendaIngresso e) {
		PreparedStatement ps = null;
		try {
			// 2 crie uma instancia de PreparedStatement
			// passe para ela a instrucao para realizar alteracoes em uma
			// registro do banco
			ps = connection.prepareStatement(INSERT);

			/**
			 * nome, id_estadio
			 */
			ps.setObject(1, e.getIngresso().getIdIngresso());
			ps.setObject(2, e.getVenda().getIdVenda());

			ps.executeUpdate();

		} catch (SQLException ex) {
			Logger.getLogger(VendaIngressoDAOImp.class.getName()).log(
					Level.SEVERE, null, ex);
		} finally {
			this.closeConnection();
		}
		return e;
	}

	@Override
	public void alterar(VendaIngresso e) {
		PreparedStatement ps = null;
		try {
			// 2 crie uma instancia de PreparedStatement
			// passe para ela a instrucao para realizar alteracoes em uma
			// registro do banco
			ps = connection.prepareStatement(UPDATE);

			ps.setObject(1, e.getIngresso().getIdIngresso());
			ps.setObject(2, e.getVenda().getIdVenda());
			ps.setObject(3, e.getIdVendaIngresso());

			ps.executeUpdate();

		} catch (SQLException ex) {
			Logger.getLogger(VendaIngressoDAOImp.class.getName()).log(
					Level.SEVERE, null, ex);
		} finally {
			this.closeConnection();
		}

	}

	@Override
	public void deletar(VendaIngresso e) {
		try {
			PreparedStatement ps = null;
			ps = connection.prepareStatement(DELETE);
			// 3 passe para o PreparedStatement o valor do id que deve ser
			// excluido do banco de dados
			ps.setObject(1, e.getIdVendaIngresso());

			ps.executeUpdate();

		} catch (SQLException ex) {
			Logger.getLogger(VendaIngressoDAOImp.class.getName()).log(
					Level.SEVERE, null, ex);
		} finally {
			this.closeConnection();
		}

	}

	@Override
	public List<VendaIngresso> findAll() {
		List<VendaIngresso> vendaIngressos = new ArrayList<VendaIngresso>();

		VendaIngressoDAO vendaIngressoDAO = DAOFactory.getVendaIngressoDAO();
		VendaDAO vendaDAO = DAOFactory.getVendaDAO();
		IngressoDAO ingressoDAO = DAOFactory.getIngressoDAO();

		List<Venda> vendas = new ArrayList<Venda>();
		List<Ingresso> ingressos = new ArrayList<Ingresso>();

		try {
			PreparedStatement ps = null;
			ResultSet rs = null;
			ps = connection.prepareStatement(ALL);

			// 4 Obtenha uma instancia de resultset
			rs = ps.executeQuery();

			while (rs.next()) {
				VendaIngresso vendaIngresso = new VendaIngresso();
				vendaIngresso.setIdVendaIngresso(rs.getInt("id_vend_ingr"));
				Venda venda = new Venda();
				venda.setIdVenda(rs.getInt("id_venda"));
				vendas = vendaDAO.buscarVendaPorId(venda);
				vendaIngresso.setVenda(vendas.get(0));
				Ingresso ingresso = new Ingresso();
				ingresso.setIdIngresso(rs.getInt("id_ingresso"));
				ingressos = ingressoDAO.buscaIngressoPorId(ingresso);
				vendaIngresso.setIngresso(ingressos.get(0));
				vendaIngressos.add(vendaIngresso);
				// 5 crie uma instancia de cidade com os dados
				// obtidos do banco e adicione a lista de cidadesf

			}

		} catch (SQLException ex) {
			Logger.getLogger(VendaIngressoDAOImp.class.getName()).log(
					Level.SEVERE, null, ex);
		} finally {
			this.closeConnection();
		}
		return vendaIngressos;

	}

	@Override
	public boolean isConnectionClose() {
		try {
			return connection.isClosed();
		} catch (SQLException ex) {
			return false;
		}
	}

	@Override
	public void openConnection() {
		if (connectionManager == null) {
			connectionManager = ConnectionManager.getInstance();
		}

		if (connection == null) {
			connection = connectionManager.getConnection();
		}

		if (isConnectionClose()) {
			connection = connectionManager.getConnection();
		}

	}

	@Override
	public void closeConnection() {
		if (connection != null && connectionManager != null) {
			if (!this.isConnectionClose()) {
				connectionManager.closeConnection(connection);
			}
		}
	}

	@Override
	public List<VendaIngresso> buscaVendaIngressoPorIdVenda(
			VendaIngresso Vendaingresso) {
		List<VendaIngresso> vendaIngressos = new ArrayList<VendaIngresso>();

		VendaIngressoDAO vendaIngressoDAO = DAOFactory.getVendaIngressoDAO();
		VendaDAO vendaDAO = DAOFactory.getVendaDAO();
		IngressoDAO ingressoDAO = DAOFactory.getIngressoDAO();

		List<Venda> vendas = new ArrayList<Venda>();
		List<Ingresso> ingressos = new ArrayList<Ingresso>();

		PreparedStatement ps = null;
		ResultSet rs = null;

		try {
			ps = connection.prepareStatement(IDVENDA);
			// 6 informe o parmetro para instrucao ID
			ps.setObject(1, Vendaingresso.getVenda().getIdVenda());

			rs = ps.executeQuery();

			while (rs.next()) {
				VendaIngresso vendaIngresso = new VendaIngresso();
				vendaIngresso.setIdVendaIngresso(rs.getInt("id_vend_ingr"));
				Venda venda = new Venda();
				venda.setIdVenda(rs.getInt("id_venda"));
				vendas = vendaDAO.buscarVendaPorId(venda);
				vendaIngresso.setVenda(vendas.get(0));
				Ingresso ingresso = new Ingresso();
				ingresso.setIdIngresso(rs.getInt("id_ingresso"));
				ingressos = ingressoDAO.buscaIngressoPorId(ingresso);
				vendaIngresso.setIngresso(ingressos.get(0));
				vendaIngressos.add(vendaIngresso);

			}
		} catch (SQLException ex) {
			Logger.getLogger(VendaIngressoDAOImp.class.getName()).log(
					Level.SEVERE, null, ex);
		} finally {
			this.closeConnection();
		}
		return vendaIngressos;
	}

	@Override
	public List<VendaIngresso> buscaVendaIngressoPorIdIngresso(
			VendaIngresso VendaIngresso) {
		List<VendaIngresso> vendaIngressos = new ArrayList<VendaIngresso>();
		List<Venda> vendas = new ArrayList<Venda>();
		List<Ingresso> ingressos = new ArrayList<Ingresso>();

		VendaIngressoDAO vendaIngressoDAO = DAOFactory.getVendaIngressoDAO();
		VendaDAO vendaDAO = DAOFactory.getVendaDAO();
		IngressoDAO ingressoDAO = DAOFactory.getIngressoDAO();

		

		PreparedStatement ps = null;
		ResultSet rs = null;
		
		try {
			ps = connection.prepareStatement(IDINGRESSO);
			// 6 informe o parmetro para instrucao ID
			ps.setObject(1, VendaIngresso.getIngresso().getIdIngresso());

			rs = ps.executeQuery();
			
			while (rs.next()) {
				
				Ingresso ingresso = new Ingresso();
				ingresso.setIdIngresso(VendaIngresso.getIngresso().getIdIngresso());
				ingressos = ingressoDAO.buscaIngressoPorId(ingresso);
				ingresso = ingressos.get(0);
				
				Venda venda = new Venda();
				venda.setIdVenda(rs.getInt("id_venda"));
				vendas = vendaDAO.buscarVendaPorId2(venda);
				venda = vendas.get(0);
				
				
				
				
				VendaIngresso vendaIngresso = new VendaIngresso();
				vendaIngresso.setIdVendaIngresso(rs.getInt("id_vend_ingr"));
				venda.setVendaIngresso(vendaIngresso);
				
				
				
				vendaIngresso.setIngresso(ingresso);
				
				venda.setVendaIngresso(vendaIngresso);
				vendaIngresso.setVenda(venda);
				venda.setVendaIngresso(vendaIngresso);
				vendaIngresso.setVenda(venda);
				
				
				vendaIngressos.add(vendaIngresso);

			}
		} catch (SQLException ex) {
			Logger.getLogger(VendaIngressoDAOImp.class.getName()).log(
					Level.SEVERE, null, ex);
		} finally {
			this.closeConnection();
		}
		return vendaIngressos;
	}

	@Override
	public List<VendaIngresso> buscaVendaIngressoPorId(
			VendaIngresso VendaIngresso) {
		List<VendaIngresso> vendaIngressos = new ArrayList<VendaIngresso>();

		VendaIngressoDAO vendaIngressoDAO = DAOFactory.getVendaIngressoDAO();
		VendaDAO vendaDAO = DAOFactory.getVendaDAO();
		IngressoDAO ingressoDAO = DAOFactory.getIngressoDAO();

		List<Venda> vendas = new ArrayList<Venda>();
		List<Ingresso> ingressos = new ArrayList<Ingresso>();

		PreparedStatement ps = null;
		ResultSet rs = null;

		try {
			ps = connection.prepareStatement(IDVENDAINGRESSO);
			// 6 informe o parmetro para instrucao ID
			ps.setObject(1, VendaIngresso.getIdVendaIngresso());

			rs = ps.executeQuery();

			while (rs.next()) {
				VendaIngresso vendaIngresso = new VendaIngresso();
				vendaIngresso.setIdVendaIngresso(rs.getInt("id_vend_ingr"));
				Venda venda = new Venda();
				venda.setIdVenda(rs.getInt("id_venda"));
				vendas = vendaDAO.buscarVendaPorId2(venda);
				venda = vendas.get(0);
				venda.setVendaIngresso(vendaIngresso);
				vendaIngresso.setVenda(vendas.get(0));
				Ingresso ingresso = new Ingresso();
				ingresso.setIdIngresso(rs.getInt("id_ingresso"));
				ingressos = ingressoDAO.buscaIngressoPorId(ingresso);
				vendaIngresso.setIngresso(ingressos.get(0));
				venda.setVendaIngresso(vendaIngresso);
				vendaIngresso.setVenda(venda);
				venda.setVendaIngresso(vendaIngresso);
				vendaIngresso.setVenda(venda);
				vendaIngressos.add(vendaIngresso);

			}
		} catch (SQLException ex) {
			Logger.getLogger(VendaIngressoDAOImp.class.getName()).log(
					Level.SEVERE, null, ex);
		} finally {
			this.closeConnection();
		}
		return vendaIngressos;
	}
}


